package com.basker.pisces.core.meta;

import java.sql.JDBCType;

import com.basker.pisces.core.jdbc.JdbcTypeMapper;

/**
 * 数据字段，存储基本类型
 *
 * @author hangwen
 */
public interface IDataField extends IField {

    /**
     * 系统内置的、统一的主键字段名称
     */
    static final String ID_FIELD_NAME = "Id";

    /**
     * 获取字段关联的数据库字段名
     *
     * @return
     */
    String getDbFieldName();

    /**
     * 获取字段描述
     *
     * @return
     */
    String getDescription();

    /**
     * 获取字段存储值的类型
     *
     * @return
     */
    Class<?> getFieldClass();

    /**
     * 获取字段的所属数据表
     *
     * @return
     */
    String getHostTableName();

    /**
     * 获取字段的JDBCType
     *
     * <p>
     * 如果返回null或者{@link JDBCType#NULL},则会根据{@link #getFieldClass()}获取对应的默认JDBCType,默认映射规则见{@link JdbcTypeMapper}
     *
     * @return
     */
    JDBCType getJDBCType();

    /**
     * 获取JDBCType对应的int值
     *
     * @return
     */
    int getJDBCTypeNumber();

    /**
     * 获取数据库字段类型的长度,返回null或者-1，表示以数据库默认为准
     *
     * @return
     */
    Integer getLength();

    /**
     * 获取数据库字段类型的精度，只对数字类型有效,返回null或者-1，表示以数据库默认为准
     *
     * @return
     */
    Integer getScale();

    /**
     * 字段在元数据中的顺序
     *
     * @return
     */
    int getSort();

    /**
     * 当前字段的值，在xml序列化时，是否是CDATA类型的数据
     *
     * @return
     */
    boolean isCData();

    /**
     * 是否是索引
     *
     * @return
     */
    boolean isIndexField();

    /**
     * 当前字段是否是主键字段
     *
     * @return
     */
    boolean isPkField();

    /**
     * 设置数据库的所属数据表
     *
     * @param tableName
     */
    void setHostTableName(String tableName);
}
